import java.util.Iterator;
import java.util.List;
import java.util.Random;

import javax.swing.text.AbstractDocument.LeafElement;

public class Loup extends Animal{
	private int age;
    private int faim;//niveau de faim
    private boolean isMale;
    
    private static final int ageMax=60; //Age maximal
	private static final int pregnantAge = 7;//Age minimal pour la reproduction
	private static final int valeurNourissanteMouton = 5;//Définit quand le loup aura faim
	private static final int mortDeFaim = 10;//Nombre de tours sans manger
	private static final Random rand = Randomizer.getRandom();
	
	
   
    // On peut creer soit un loup jeune(age zero et pas affammé), soit avec un age et faim random
    public Loup(boolean ageRandom, Grille grille, Position position){ 
        super(grille, position);
        if(ageRandom) {
            age = rand.nextInt(ageMax);
            faim = rand.nextInt(mortDeFaim-2);
        }
        else {
            age = 0;
            faim = 0;
        }
    }
 
    // Les actions principales des loups: la chasse, la reproduction, la mort
    public void act(List<Animal> newLoups){
        incrementeAge();
        incrementeFaim();
        if(estVivant()) {
            accoucher(newLoups);            
            Position newPosition = trouveManger();
            if(newPosition == null) { 
                // Pas de nourriture trouvée -> cherche une autre position
                newPosition = getGrille().positionAdjacDispo(getPosition());
            }
            // Voit s'il est possible de bouger
            if(newPosition != null) {
                setPosition(newPosition);
            }
            else {
                // Il meurt car il y a trop d'animaux
                setMort();
            }
        }
    }

    // Incrémente l'age
    private void incrementeAge(){ 
        age++;
        if(age > ageMax) {
            setMort();
            System.out.println("Le loup "+getPosition()+" est mort de la viellesse. ");
            //Laisse des sels minéraux à cette case si possible
            Grille grille = getGrille();
            Position p = getPosition();
            Herbe herbe = grille.getHerbeAt(p);
            herbe.setSelMineral();
        }
    }

    private void incrementeFaim(){//incrementer le niveau de faim
        faim++;
        if(faim > 10) {
            setMort();
            System.out.println("Le loup "+getPosition()+" est mort de faim. ");
            //Laisse des sels minéraux à cette case si possible
            Grille grille = getGrille();
            Position p = getPosition();
            Herbe herbe = grille.getHerbeAt(p);
            herbe.setSelMineral();
       }
    }

    // Regarde les moutons adjascents
    //@return La position du mouton mangé
    private Position trouveManger(){
        Grille grille = getGrille();
        List<Position> adjacent = grille.positionsAdjacentes(getPosition());
        Iterator<Position> iter = adjacent.iterator();
        while(iter.hasNext()) {
            Position pos = iter.next();
            Object animal = grille.getObjectAt(pos);
            if(animal instanceof Mouton) {
                Mouton mouton = (Mouton) animal;
                if(mouton.estVivant()) { 
                    mouton.setMort();
                    System.out.println("le loup "+getPosition()+" a manger un mouton " + mouton.getPosition());
                    faim -= valeurNourissanteMouton;
                    return pos;
                }
            }
        }
        return null;
    }

    // Accouche un loup si c'est une femelle
    private void accoucher(List<Animal> newLoups){
        Grille grille = getGrille();
        List<Position> adjacent = grille.positionsAdjacentes(getPosition());
        Iterator<Position> iter = adjacent.iterator();
        while(iter.hasNext()) {
            Position pos = iter.next();
            Object animal = grille.getObjectAt(pos);
            if(animal instanceof Loup) {
                Loup l = (Loup) animal;
                if(l.estVivant()&&this.isMale!=l.isMale()&&l.peutAccoucher()&&peutAccoucher()) {
                	if (!isMale){
                		List<Position> dispos = grille.positionsAdjacentesDispos(getPosition());
                		Position position = dispos.get(0);
                		Loup jeune = new Loup(false, grille, position);
                		newLoups.add(jeune);
                		System.out.println("Le nouveau loup est né à la position"+pos);
                     }
                	else l.accoucher(newLoups);
                }
            }
            
        }
    }
    
   //@return Assez vieux pour se reproduire
   public boolean peutAccoucher(){
	   if (this.age>=pregnantAge)return true;
	   else return false;
   }
   public int getAge(){
	   return age;
   }
   public boolean isMale(){
	   return this.isMale;
   }


}
